#pragma once

#include <vex/core/contract/handle.h>
#include <vex/core/contract/memory_resource.h>

namespace tests {

    template <class T>
    struct alias {};

    struct VEX_ABSTRACT user_contract : public vex::core::contract::handle {

        virtual int get_value(alias<int> const &) const = 0;
        virtual double get_value(alias<double> const &) const = 0;
        virtual char const * get_value(alias<char const *> const &) const = 0;

        virtual void set_value(int) = 0;
        virtual void set_value(double) = 0;
        virtual void set_value(char const *) = 0;

        virtual user_contract* clone(vex::core::contract::memory_resource* p_mem_res = nullptr) const = 0;

        VEX_PROTECT_CONTRACT(user_contract);
    };
}